﻿using AutoMapper;
using ExcellentProjectPlus.Aplicacion.Calificaciones.Parciales;
using ExcellentProjectPlus.Dominio.Calificaciones.Entidades;
using Servicios.Calificaciones.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Description;

namespace Servicios.Calificaciones.Controllers
{
    public class ParcialesController : ApiController
    {
        #region Propiedades
        IServicioDeGestionDeParciales _servicioDeGestionDeParciales;
        #endregion

        #region Constructores
        public ParcialesController(IServicioDeGestionDeParciales servicioDeGestionDeParciales)
        {
            _servicioDeGestionDeParciales = servicioDeGestionDeParciales;
            Mapper.CreateMap<Parcial, ParcialModel>();
        }
        #endregion

        [ResponseType(typeof(IEnumerable<Parcial>))]
        public IHttpActionResult Get()
        {
            return Ok(_servicioDeGestionDeParciales.ObtenerParciales());
        }

        [ResponseType(typeof(Parcial))]
        public IHttpActionResult GetParcial(int id)
        {
            Parcial parcial = _servicioDeGestionDeParciales.ObtenerParcialPorId(id);
            if (parcial == null)
            {
                return NotFound();
            }

            return Ok(parcial);
        }

        [ResponseType(typeof(IEnumerable<Parcial>))]
        [Route("api/parciales/periodo/{id}")]
        public IHttpActionResult GetParcialPorIdPerido(int id)
        {
            IEnumerable<Parcial> parciales = _servicioDeGestionDeParciales.ObtenerParcialesPorIdDePeriodo(id);
            if (parciales == null)
            {
                return NotFound();
            }

            return Ok(Mapper.Map<IEnumerable<Parcial>, IEnumerable<ParcialModel>>(parciales));
        }

        public IHttpActionResult Put(int id, [FromBody]Parcial parcial)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            if (id != parcial.Id)
            {
                return BadRequest();
            }

            _servicioDeGestionDeParciales.ModificarParcial(parcial);

            return StatusCode(HttpStatusCode.NoContent);
        }

        [ResponseType(typeof(Parcial))]
        public IHttpActionResult Post(Parcial parcial)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            _servicioDeGestionDeParciales.AgregarParcial(parcial);

            return CreatedAtRoute("DefaultApi", new { id = parcial.Id }, parcial);
        }

        [HttpDelete]
        [ResponseType(typeof(Parcial))]
        [Route("api/parciales/{id}")]
        public IHttpActionResult Delete(int id)
        {
            Parcial parcial = _servicioDeGestionDeParciales.ObtenerParcialPorId(id);
            if (parcial == null)
            {
                return NotFound();
            }

            _servicioDeGestionDeParciales.EliminarParcial(parcial);

            return Ok(parcial);
        }

        private bool ParcialExists(int id)
        {
            return _servicioDeGestionDeParciales.ObtenerParcialPorId(id) != null;
        }

        [HttpGet()]
        [Route("api/parciales/GetPagedParciales/{pageIndex}/{pageSize}")]
        public IEnumerable<Parcial> GetPagedParciales(int pageIndex, int pageSize)
        {
            return _servicioDeGestionDeParciales.ObtenerParcialesPaginado(pageIndex, pageSize);
        }
    }
}
